const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const Strategy = require('passport-http-bearer').Strategy;

var jwt = require('jsonwebtoken');
var _ = require('loadsh');
var jwt_config = require('config').get('jwt_config');

// 通过登录函数初始化
/**
 * 初始化 passport 框架
 * 
 * @param  {[type]}   app       全局应用程序
 * @param  {[type]}   loginFunc 登录函数
 * @param  {Function} cb  回调函数
 */
module.exports.setup = (app, loginFunc, cb) => {
    passport.use(new LocalStrategy(
        (username, passport, done) => {
            if (!loginFunc) return done('登录函数未验证');
            loginFunc(username, passport, (err, user) => {
                if (err) return done(err);
                return done(null, user);
            })
        }
    ));
    passport.use(new Strategy(
        (token, done) => {
            jwt.verify(token, jwt_config.get('secretKey'), (err, decode) => {
                if (err) return done(err);
                return done(null, decode);
            })
        }
    ));

    app.use(passport.initialize);

    if (cb) cb();
}

/**
 * 登录验证逻辑
 * 
 * @param  {[type]}   req  请求
 * @param  {[type]}   res  响应
 * @param  {Function} next [description]
 */
module.exports.login = (req, res, next) => {
    passport.authenticate('local', (err, user, info) => {
        if (err) return res.sendResult(null, 400, err);
        if (!user) return res.sendResult(null, 400, "参数错误");

        //签发Token
        var token = jwt.sign({ 'uid': user.uid, 'rid': user.rid },//payload
            jwt_config.get('secret'),//secret
            { 'expiresIn': jwt_config.get('expiresIn') }//option,如 期限
        );

        user.token = 'Bearer ' + token;
        return res.sendResult(user, 200, '登录成功')
    })(req, res, next)
}

/**
 * token验证函数
 * 
 * @param  {[type]}   req  请求对象
 * @param  {[type]}   res  响应对象
 * @param  {Function} next 传递事件函数
 */
module.exports.tokenAuth = (req, res, next) => {
    console.log('进入')
    passport.authenticate('Bearer', { session: false }, (err, tokenData) => {
        if (err) return res.sendResult(null, 400, '无效token');
        if (!tokenData) return res.sendResult(null, 400, '无效token');
        req.userinfo = {};
        req.userinfo.uid = tokenData['uid'];
        req.userinfo.rid = tokenData['rid'];
        next();
    })(req, res, next)
}